package cn.com.bluemoon.daps.api.sys;

import cn.com.bluemoon.daps.api.sys.factory.RemoteSysBizLineFallbackFactory;
import cn.com.bluemoon.daps.common.annotation.FcApiFor;
import cn.com.bluemoon.daps.common.constant.ServiceNameConstants;
import cn.com.bluemoon.daps.common.domain.ResultBean;
import cn.com.bluemoon.daps.system.entity.DapSystemBizLine;
import cn.com.bluemoon.daps.system.vo.BizLineDetailResponseVo;
import cn.com.bluemoon.daps.system.vo.BizLineResponseVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import springfox.documentation.annotations.ApiIgnore;

import java.util.List;

/**
 * 业务线
 *
 * @author Jarod.Kong
 */
@FeignClient(value = ServiceNameConstants.DapsApiSystem.SERVICE, fallbackFactory = RemoteSysBizLineFallbackFactory.class)
@RequestMapping(ServiceNameConstants.DapsApiSystem.BASE_URI + ServiceNameConstants.DapsApiStandard.API_SYS_BIZLINE)
@ApiIgnore
public interface RemoteSystemBizLineService {
    /**
     * 业务线列表
     * <pre>
     * 特别说明：
     * {@link DapSystemBizLine#getDataManager()}为业务线负责人（最初需求为数据负责人，变更为业务线负责人）
     * {@link BizLineDetailResponseVo#getAdmins()}为系统管理员
     * {@link BizLineDetailResponseVo#getDevelops()}为系统开发者
     * </pre>
     */
    @GetMapping
    @FcApiFor(team = {"数据工具组", "资产平台组"})
    ResultBean<List<BizLineResponseVo>> bizLines();

    /**
     * id获取业务线信息
     * <pre>
     * 特别说明：
     * {@link DapSystemBizLine#getDataManager()}为业务线负责人（最初需求为数据负责人，变更为业务线负责人）
     * {@link BizLineDetailResponseVo#getAdmins()}为系统管理员
     * {@link BizLineDetailResponseVo#getDevelops()}为系统开发者
     * </pre>
     */
    @GetMapping("/{bizLineId}")
    @FcApiFor(team = {"数据工具组", "资产平台组"})
    ResultBean<BizLineResponseVo> getById(@PathVariable("bizLineId") String bizLineId);

    /**
     * 工号（工号为业务线负责人）获取相关业务线
     * <pre>
     * 特别说明：
     * {@link DapSystemBizLine#getDataManager()}为业务线负责人（最初需求为数据负责人，变更为业务线负责人）
     * {@link BizLineDetailResponseVo#getAdmins()}为系统管理员
     * {@link BizLineDetailResponseVo#getDevelops()}为系统开发者
     * </pre>
     */
    @GetMapping("/bizLinesByDataManagerUserId")
    @FcApiFor(team = {"数据工具组", "资产平台组"})
    ResultBean<List<BizLineResponseVo>> bizLinesByDataManagerUserId(@RequestParam("dataManager") String userId);

    /**
     * 工号（工号为业务线负责人或系统管理员）获取相关业务线
     * <pre>
     * 特别说明：
     * {@link DapSystemBizLine#getDataManager()}为业务线负责人（最初需求为数据负责人，变更为业务线负责人）
     * {@link BizLineDetailResponseVo#getAdmins()}为系统管理员
     * {@link BizLineDetailResponseVo#getDevelops()}为系统开发者
     * </pre>
     */
    @GetMapping("/bizLinesByDataManagerOrAdminUserId")
    @FcApiFor(team = {"资产平台组"})
    ResultBean<List<BizLineResponseVo>> bizLinesByDataManagerOrAdminUserId(@RequestParam("userId") String userId);

    /**
     * 工号（工号为系统管理员）获取相关业务线
     * <pre>
     * 特别说明：
     * {@link DapSystemBizLine#getDataManager()}为业务线负责人（最初需求为数据负责人，变更为业务线负责人）
     * {@link BizLineDetailResponseVo#getAdmins()}为系统管理员
     * {@link BizLineDetailResponseVo#getDevelops()}为系统开发者
     * </pre>
     */
    @GetMapping("/bizLinesByAdminUserId")
    @FcApiFor(team = {"资产平台组"})
    ResultBean<List<BizLineResponseVo>> bizLinesByAdminUserId(@RequestParam("userId") String userId);

    /**
     * 工号（工号为系统管理员或系统开发人员）获取相关业务线
     * <pre>
     * 特别说明：
     * {@link DapSystemBizLine#getDataManager()}为业务线负责人（最初需求为数据负责人，变更为业务线负责人）
     * {@link BizLineDetailResponseVo#getAdmins()}为系统管理员
     * {@link BizLineDetailResponseVo#getDevelops()}为系统开发者
     * </pre>
     */
    @GetMapping("/bizLinesByAdminOrDevelopUserId")
    @FcApiFor(team = {"资产平台组"})
    ResultBean<List<BizLineResponseVo>> bizLinesByAdminOrDevelopUserId(@RequestParam("userId") String userId);


    /**
     * 根据业务线id和系统id获取业务线与系统的人员关系
     * <pre>
     * 特别说明：
     * {@link BizLineDetailResponseVo#getAdmins()}为系统管理员
     * {@link BizLineDetailResponseVo#getDevelops()}为系统开发者
     * </pre>
     */
    @GetMapping("/bizLineDetail")
    public ResultBean<List<BizLineDetailResponseVo>> bizLineDetailsByBizLineIdAndSystemId(@RequestParam(value = "bizLineId", required = false) Integer bizLineId,
                                                                                          @RequestParam("systemId") String systemId);

}
